package com.sybil.ot.dao;

import com.sybil.ot.dominio.DetalleSolicitud;
import com.sybil.ot.dominio.ResponsablePaso;
import com.sybil.ot.dominio.Solicitud;
import com.sybil.ot.dominio.SolicitudPK;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

@Repository("solicitudDAO")
public class SolicitudDAO extends AbstractDAO<Solicitud, SolicitudPK> {

   public SolicitudDAO() {
      super(Solicitud.class);
   }

   public Solicitud obtenerSolicitud(SolicitudPK llave) {
      return obtener(llave);
   }

   public Solicitud obtenerSolicitud(String claveFlujo, int numero) {
      return obtener(new SolicitudPK(claveFlujo, numero));
   }

   public List<Solicitud> obtenerSolicitudes() {
      return obtener();
   }

   public List<Solicitud> obtenerSolicitudes(String claveUsuario) {
      Criteria c = sesionActual().createCriteria(Solicitud.class);
      c.add(Restrictions.eq("terminado", "N"))
              .addOrder(Order.desc("llave.claveFlujo"))
              .addOrder(Order.desc("llave.numeroSolicitud"));
      List<Solicitud> list = c.list();
      List<Solicitud> solicitudesPendientes = new ArrayList<Solicitud>();
      for (Solicitud solicitud : list) {
         List<ResponsablePaso> responsables = solicitud.getPaso().getResponsablesPaso();
         boolean esReponsable = false;
         for (ResponsablePaso reponsable : responsables) {
            if (reponsable.getEsAprobador().equals("S") && reponsable.getUsuario().getClave().equals(claveUsuario)) {
               esReponsable = true;
            }
         }
         if (esReponsable) {
            int instancia = solicitud.getInstancia();
            List<DetalleSolicitud> detalles = solicitud.getDetalles();
            for (DetalleSolicitud detalle : detalles) {
               if (detalle.getInstancia() == instancia) {
                  if (!detalle.getUsuario().getClave().equals(claveUsuario)) {//que no haya dado su aprobacion
                     solicitudesPendientes.add(solicitud);
                  }
               } else {
                  //es otra instancia
               }
            }
         } else {
            // no es reponsable
         }
      }
//      Query query = sesionActual().createSQLQuery(
//              "select * from stock s where s.stock_code = :stockCode")
//              .addEntity(Solicitud.class)
//              .setParameter("claveUsuario", "claveUsuario");
//      List result = query.list();
      return solicitudesPendientes;
   }

   public void guardarSolicitud(Solicitud solicitud) {
      guardar(solicitud);
   }

   public void editarSolicitud(Solicitud solicitud) {
      editar(solicitud);
   }

   public void eliminarSolicitud(Solicitud solicitud) {
      eliminar(solicitud);
   }

   public Integer obtenerSecuencia(String claveFlujo) {
      Integer siguiente = 0;
      Query query = sesionActual().getNamedQuery("Solicitud.maxPorFlujo")
              .setString("claveFlujo", claveFlujo);
      List list = query.list();
      Object get = list.get(0);
      if (get != null) {
         siguiente = (Integer) list.get(0);
      }
      siguiente++;
      return siguiente;
   }

   public Integer obtenerInstancia(String claveFlujo, int numero) {
      Integer siguiente = 0;
      Query query = sesionActual().getNamedQuery("Solicitud.instanciaActual")
              .setString("claveFlujo", claveFlujo).setInteger("numero", numero);
      List list = query.list();
      Object get = list.get(0);
      if (get != null) {
         siguiente = (Integer) list.get(0);
      }
      siguiente++;
      return siguiente;
   }

   public List<Solicitud> obtenerHistorico(String claveFlujo, Date fechaDesde,
           Date fechaHasta, String estatus, int numeroSolicitud) {
      Criteria c = sesionActual().createCriteria(Solicitud.class);
      if (claveFlujo != null && !"".equals(claveFlujo)) {
         c.add(Restrictions.eq("flujo.clave", claveFlujo));
      }
      if (numeroSolicitud != 0) {
         c.add(Restrictions.eq("llave.numeroSolicitud", numeroSolicitud));
      }
      if (estatus != null && !"T".equals(estatus)) {
         if ("A".equals(estatus)) {
            c.add(Restrictions.eq("terminado", "S"))
                    .add(Restrictions.eq("finalCorrecto", "S"));
         } else if ("P".equals(estatus)) {
            c.add(Restrictions.eq("terminado", "S"))
                    .add(Restrictions.eq("finalCorrecto", "N"));
         } else {
            c.add(Restrictions.eq("terminado", "N"));
         }
      }
      if (fechaDesde != null && fechaHasta != null ) {
         c.add(Restrictions.between("fecha", fechaDesde, fechaHasta));
      }
      return c.list();
   }
}
